原始题目:剑指 Offer 28. 对称的二叉树 (opens new window)
解题思路:
判断一棵树是否对称,实际上应该判断树的 左节点 和 右节点 是否互为镜像。
然后判断两颗树 , 是否互为镜像,首先需要判断各自根节点的值是否相等,然后再递归比较 的左子树是否和 的右子树互为镜像,并且 的右子树也要和 的左子树互为镜像。(互为镜像的意思其实就是对称)
递归函数
终止条件:
- 如果 和 同时为 ,返回 。
- 如果 或者 只有一个为 ,返回 。
- 如果 ,返回 。
递归工作
- 判断 和 是否互为镜像。
- 判断 和 是否互为镜像。
代码:
public boolean isSymmetric(TreeNode root) {
if(root == null) {
return true;
}
return isSymmetric(root.left, root.right);
}
private boolean isSymmetric(TreeNode p, TreeNode q) {
if(p == null && q == null) {
return true;
}
if(p == null || q == null) {
return false;
}
if(p.val != q.val) {
return false;
}
return isSymmetric(p.left, q.right) && isSymmetric(p.right, q.left);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
复杂度分析
时间复杂度: 为树的节点数量,判断对称需要遍历树的所有节点,一次递归判断 个节点是否对称,因此最多调用 次递归函数。
空间复杂度:最差情况下,树退化成链表,系统使用 大小的递归栈。